La section 1 vous présentera rapidement le système d'exploitation Linux, particulièrement bash, l'interpréteur de commandes avec lequel nous travaillerons tout au long de la session. Vous y verrez quelques commandes de base fort utile pour jouer dans le système de fichiers.
1.2 - Commandes de base - résumé rapide
1.3 - Système de fichiers - notions préliminaire
1.4 - Deux commandes de base en plus de détails (cd et ls)
1.1.1 - L'administrateur: root
Sous Linux, par défaut, un seul compte a pouvoir de vie ou de mort sur le système, pouvant tout faire, contourner toutes les permissions du système de fichiers, pouvant gérer les usagers et leurs mots de passe ainsi qu'administrer le serveur. C'est grosso-modo l'équivalent du compte Administrateur sous Windows, en Linux/Unix on l'appelle root. Lorsque vous êtes logués en root, vous pouvez tout faire. Mais n'oubliez jamais qu'à grand pouvoir correspond grande responsabilité, comme disait l'autre. Si en tant que root vous pouvez tout faire, vous pouvez donc faire énormément de dégâts sur un système par simple distraction.
Il est donc fortement recommandé aux administrateurs de se créer un compte personnel "ordinaire" qu'ils utiliseront pour leurs tâches de tous les jours. Ils n'utiliseront le compte root qu'à quelques moments périodiques, lorsqu'il n'auront pas le choix, pour des tâches administratives.
La majorité des distributions de Linux vous demanderont, à l'installation, de définir le mot de passe du compte root, puis de vous créer un compte ordinaire.
Ubuntu toutefois, diffère quant à sa philosophie d'usage du root. Vous vous rappellerez sans doute qu'on ne vous a jamais demandé de définir le mot de passe du compte root. Comment allez-vous pouvoir vous y loguer?
Pour l'instant, vous ne le pouvez pas - vous devrez vous loguer sur le système en utilisant votre compte "ordinaire". La raison est simple: par défaut le compte root est désactivé et n'a donc pas de mot de passe. Ainsi, quelqu'un qui tente d'en trouver le mot de passe pour s'approprier le serveur est voué à l'échec dès le départ.
Pour les moments où vous aurez tout de même besoin d'un accès root, vous pourrez utiliser la commande sudo. sudo signifie "super user do" (ou "faire en tant que super usager" - donc en tant que root). Il suffit de préfixer toute commande d'administration de la commande sudo et vous l'exécutez comme si vous étiez root. Par exemple:
sudo shutdown -h now
Ceci éteindra votre ordinateur dès maintenant, commande qui demande évidemment d'être root. sudo vous demandra simplement d'entrer votre mot de passe (le vôtre, pas celui de root).
Pour pouvoir utiliser sudo, il faut que notre nom soit présent dans le fichier /etc/sudoers (que l'on ne devrait éditer qu'avec la commande visudo et non à la main - on y reviendra un jour). Pour l'instant les seuls comptes qui sont dans le ficiher /etc/sudoers sont ceux qui font partie du groupe admin - votre compte est le seul membre de ce groupe, mais vous pourrez éventuellement en ajouter d'autres.
Les avantages d'un compte root désactivé et de l'usage de sudo:
Si vous en avez assez de devoir taper sudo avant chaque commande que vous faites, dans le cas où vous en avez plusieurs à entrer une après l'autre, vous pouvez contourner cette limitation en faisant sudo -i ce qui vous fera basculer en mode root jusqu'à ce que vous tapiez exit. Toutefois, bien que ça soit souvent plus pratique, c'est en faisant ça qu'on fait parfois des gaffes donc gardez l'oeil ouvert.
On verra également plus tard comment réactiver le compte root et désactiver le sudo si jamais cette stratégie ne vous plait pas - du coup vous saurez comment la mettre en place sur une autre distribution si elle vous plait.
Retour à la table des matières de la section
Lorsque vous allumez votre ordinateur, après le chargement et l'exécution du BIOS, vous arrivez à GRUB. GRUB signifie "Grand Unified Bootloader" – c'est un petit programme qui s'installe sur le MBR (Master Boot Record) et qui vous permet de choisir quel système d'exploitation vous voulez utiliser. Par défaut, si vous appuyez simplement sur ENTER (ou si vous attendez quelques secondes sans rien faire), GRUB chargera Linux.
Les plus vieilles distributions de Linux utilisaient LILO (LInux LOader) pour remplir la même fonction. GRUB est plus efficace et permet de démarrer à peu près n'importe quoi avec un grand niveau de flexibilité.
En démarrant, Linux monte son système de fichiers, charge tous les pilotes des périphériques et démarre tous les services, en vous indiquant par un "OK" que tout a bien fonctionné. Si vous voyez un "FAILED" quelque part, c'est signe qu'une opération a échoué, mais ne paniquez pas, c'est fort probable que ça ne nous dérange pas pour l'instant (par exemple, problème de carte de son ou de carte réseau (on ne s'en servira pas encore de toute façon)). Tant que vous atteignez l'écran de login, c'est déjà pas mal.
Par défaut, Ubuntu commence en mode graphique. On peut passer à l'écran de login texte en faisant CTRL-Alt-F1. De là, on peut revenir à l'écran de login graphique en faisant CTRL-Alt-F7. En réalité, ce sont là deux consoles virtuelles différentes et on peut les utiliser en même temps, pour se loguer sous deux identités différentes si désiré, puis passer de l'une à l'autre en tout temps. Il existe également 5 autres consoles virtuelles texte qu'on peut atteindre en faisant CTRL-Alt-F2 à F6.
Retour à la table des matières de la section
1.1.3 - Mode texte vs graphique
Le "vrai" système d'exploitation Linux est en fait un OS console, un peu semblable à DOS mais en beaucoup plus puissant. L'interface graphique (appelée X-Windows) est comparable (en terme de concept, pas en terme de puissance!) à ce bon vieux Windows 3.1. À cette époque jurassique, DOS était le vrai système d'exploitation et on "démarrait" Windows lorsque nécessaire pour se donner une interface intéressante. Linux fonctionne encore de cette façon et X-Windows est une couche par-dessus le véritable OS.
Dans le cadre de ce premier cours, nous allons principalement utiliser le mode console. Vous aurez alors deux choix:
Le mode graphique est très similaire à une interface Windows, à peu de chose près. On y trouve une barre des tâches (en bas) et un menu principal semblable au menu Démarrer (en haut). On y retrouve également un équivalent au panneau de configuration (le menu Système), plusieurs applications de base et on fonctionne avec des icônes et des fenêtres – vous devriez être bien à l'aise avec tout ça sans devoir y passer beaucoup de temps. C'est la raison pour laquelle on ne s'y attardera pas en classe.
Sachez simplement que dans le monde Linux, il y a deux "saveurs" de X-Windows: Gnome et KDE. Ubuntu est livré avec Gnome par défaut, une interface où le côté esthétique est plus développé que celle de KDE (qui est tout de même tout aussi conviviale).
Retour à la table des matières de la section
Il existe plusieurs façons d'obtenir de l'aide sur Linux - Internet est rempli de pages très bien faites et de forums fort actifs sur Linux. La communauté Linux est très accomodante, adore dépanner les débutants et partager son savoir - c'est là la conséquence de vivre dans un monde gratuit et open source!
Quelques sites intéressants à retenir:
De façon générale, cherchez "Linux", "bash" ou "Ubuntu" dans Google et vous trouverez des tas de sites intéressants.
Sinon, vous trouverez de la documentation à même votre serveur Linux:
man dans ces deux derniers cas ne signifie pas "homme" mais bien "manuel d'instructions"...
Retour à la table des matières de la section
1.2 - Commandes de base - résumé rapide
Lorsque vous êtes dans une console texte (CTRL-Alt-F1) ou dans une fenêtre Terminal, vous interagissez avec bash, l'interpréteur de commandes par défaut dans le monde Linux. Il en existe d'autres, les plus populaires étant csh (C-Shell), tcsh (TC-Shell), ksh (Korn Shell) et bsh (Bourne Shell - d'ailleurs bash signifie Bourne Again Shell et c'est un désopilant jeu de mots sur Bourne Shell (du nom de son créateur) et "born again" qui signifie "renaître à une nouvelle religion").
Bash est notre interpréteur de commandes, comme CMD.EXE est celui de Windows et le bon vieux COMMAND.COM était celui de DOS (et des vieux Windows basés sur DOS).
Trois trucs intéressants pour gagner du temps dans bash:
Voici quelques commandes DOS/Windows et leur équivalent en Linux:
DOS |
Linux |
Notes |
ATTRIB (+-)attr file |
chmod <mode> file |
complètement différentes |
CD dirname\ |
cd dirname/ |
presque la même syntaxe |
COPY file1 file2 |
cp file1 file2 |
presque la même syntaxe |
DEL file |
rm file |
prudence - il n’y a pas de "undelete" ni de corbeille... |
RMDIR /s dirname |
rm -R dirname/ |
prudence - il n’y a pas de "undelete" ni de corbeille... |
DIR |
ls |
pas exactement la même syntaxe |
DIR file /S |
find . -name file |
complètement différentes |
EDIT file |
vi file |
vous risquez de ne pas aimer :) |
FORMAT |
fdformat, |
syntaxe très différente |
HELP cmd |
man cmd |
même philosophie mais man donne des résultats beaucoup plus détaillés |
MD dirname |
mkdir dirname/ |
presque la même syntaxe |
TYPE file | MORE |
less file |
beaucoup mieux |
MOVE file1 file2 |
mv file1 file2 |
beaucoup mieux |
NUL |
/dev/null |
beaucoup mieux |
RD dirname |
rmdir dirname/ |
presque la même syntaxe |
REN file1 file2 |
mv file1 file2 |
pas pour de multiples fichiers à la fois |
WIN |
startx |
deux mondes |
Retour à la table des matières de la section
Retour à la table des matières de la section
La commande ls fonctionne exactement comme le dir de Windows et permet de lister le contenu du répertoire courant ou d'un répertoire passé en paramètre. Elle possède tout un tas de switches que vous pourrez découvrir avec un simple man ls. Pour l'instant, il nous suffira de retenir:
La différence principale entre ls et dir est la présence de couleur dans sa sortie. Les couleurs identifient les types de fichiers et les principales sont les suivantes:
La commande cd fonctionne également comme en Windows et permet simplement de changer de répertoire courant. Toutefois, quelques petites différences:
Retour à la table des matières de la section
1.5.1 - Comprendre les permissions
Il existe évidemment en Linux des permissions d'accès aux fichiers et aux répertoires, comparables à ce qu'on trouve sous NTFS (mais en beaucoup plus simple).
Lorsque vous faites ls -l dans un répertoire, vous obtenez bon nombre d'informations sur chaque fichier:
-rwxr-xr-- 1 georges comptables 27281 Aug 15 2007 liste
Dans l'ordre, on y lit:
Pour comprendre la fameuse ligne de droits d'accès, il faut savoir que:
Lorsque Linux veut déterminer quels droits vous avez sur un fichier, il vérifie:
Vous avez toujours trois choix quant à votre relation par rapport à un fichier: vous êtes le propriétaire, vous êtes membre du groupe propriétaire ou vous êtes un des autres (sans lien particulier avec le fichier).
C'est pour cette raison que la ligne de droits d'accès à un fichier contient 3 triplets: rwxr-xr-- peut être séparé en trois groupes de trois caractères: rwx, r-x et r--. Chacun de ces triplets correspond à vos droits si vous êtes (respectivement) le propriétaire, membre du groupe propriétaire, un des autres.
Il ne nous reste plus qu'à comprendre la signification des caractères dans un triplet pour pouvoir deviner qui a le droit de faire quoi sur un fichier. C'est extrêmement simple:
Par exemple, pour le fichier liste montré plus haut:
Quelques notes pour compléter ces notions:
Retour à la table des matières de la section
1.5.2 - Modifier les permissions
Il faut d'abord savoir que la seule personne autorisée à modifier les permissions sur un fichier/répertoire donné est son propriétaire, et ce peu importe les permission qui lui sont accordées ou qui sont accordées aux autres. La seule exception à cette règle est évidemment root, qui peut tout faire sur son système.
Il existe trois commandes pour modifier les permissions sur un fichier:
Il existe deux façons d'utiliser chmod: la façon relative (qui enlève ou ajoute des droits à ceux déjà présents) et la façon absolue (qui redéfinit complètement les droits d'un seul coup).
La syntaxe de la façon relative est la suivante:
chmod <quiXperm> <fichier>
Dans cette syntaxe:
Par exemple:
Notez que l'on peut cumuler plusieurs modifications en une même commande en les séparant par des virgules comme ceci: chmod u-w,go+rx,g+w liste.
La syntaxe de la façon absolue est la suivante:
chmod <nombre en octal> <fichier>
Le nombre est octal est composé de trois chiffres de 0 à 7 représentant respectivement les droits donnés au propriétaire, au groupe et aux autres.
Pour former chacun des nombres, on attribue simplement le chiffre 4 à la permission r, le chiffre 2 à la permission w et le chiffre 1 à la permission x. On additionne ensuite les chiffres correspondants aux droits que l'on veut donner.
Par exemple: 7 équivaut à tous les droits (rwx - 4+2+1). 5 équivaut au droit de lire et d'exécuter (r-x - 4+1) et 0 équivaut à aucun droit (---).
On fait la même chose pour chacun des triplets et on "colle" les trois chiffres ensemble pour obtenir le nombre final.
Par exemple: 755 équivaut à tous les droits pour le propriétaire, le droit de lire et d'exécuter pour les membres du groupe propriétaire et les autres. 750 équivaut à tous les droits pour le propriétaire, le droit de lire et d'exécuter pour les membres du groupe propriétaire et aucun droit pour les autres. 666 équivaut au droit de lire et d'écrire pour tout le monde (en plus d'être le nombre de la bête).
Retour à la table des matières de la section
Il existe deux catégories de liens sous Linux: les liens symboliques et les liens "durs" (hard links).
Un lien dur est carrément un autre nom pour un fichier. Chaque lien dur est stocké dans la table des fichiers (appelée table des inodes) et pointe vers les mêmes blocs physiques du disque. Un lien dur ne peut pas exister sans sa cible et un fichier n'est effacé que quand tous ses liens durs sont effacés.
La seule indication qu'un fichier est un lien dur est visible dans ls -l: le nombre de liens durs est plus grand que 1. Notez que ce nombre sera le même chez tous les liens durs, puisque ces liens sont en fait le même fichier (c'est très philosophique comme concept, ça rappelle le principe de la Sainte Trinité...).
Une fois les liens créés, une bonne façon d'identifier ce qui pointe vers quoi est de faire ls -i (ou plus clair encore ls -il), ce qui affiche le numéro d'index (le inode) de chaque fichier. Deux fichiers ayant le même inode sont deux liens durs vers le même fichier. Il est impossible alors de savoir lequel est l'original et lequel est le lien (en fait, les deux sont des liens!).
Si on efface un lien dur, le fichier en tant qu'entité physique continue d'exister tant qu'il y a d'autres liens qui pointent vers lui.
On verra souvent le mot "unlink" (délier) comme synonyme d'effacer puisque pour effacer un fichier, il faut le délier en détruisant tous les liens durs qui pointent vers le fichier physique.
Pour créer un lien dur il suffit de faire: ln <cible> <nom du lien dur>
Un lien symbolique est bien différent et ressemble beaucoup plus au concept de raccourci de Windows. C'est un fichier spécial de type "l" (lien), ayant son propre inode et qui pointe vers le inode de son fichier cible. Un lien symbolique peut exister même si sa cible disparait et une cible peut être effacée même s'il existe des liens symboliques qui pointent vers elle.
Un lien symbolique qui pointe vers une cible qui n'existe pas (ou qui n'existe plus) est souvent appelé lien orphelin ou lien mort.
Un lien symbolique est très facile à identifier: ls le colore en bleu pâle (cyan) et ls -l met un "l" comme type de fichier et indique carrément avec une flèche (->) vers quoi il pointe.
Pour créer un lien symbolique, on fait simplement: ln -s <cible> <nom du lien>
Quel est l'intérêt d'utiliser un type de lien plutôt qu'un autre? Tout dépend de ce que l'on veut faire (il y a certaines préoccupations de performances que l'on peut voir résumées ici) mais la plupart du temps on fonctionnera avec un lien symbolique, ce qui est beaucoup plus simple à manipuler.
Retour à la table des matières de la section
Un joker (souvent appelé wildcard ou caractère générique) est un caractère qui en remplace un ou plusieurs autres. Un joker est utilisé dans la création d'un masque qui permet d'affecter plusieurs fichiers avec une seule commande.
Il existe trois jokers en linux:
Le point d'interrogation remplace exactement un caractère quelconques, pas plus, pas moins. Par exemple, si je fais ceci:
rm allo?.txt
j'efface d'un seul coup les fichiers allo1.txt, allo2.txt et alloa.txt mais pas allo.txt ni allo10.txt ni allotoi.txt.
L'astérisque remplace zéro, un ou plusieurs caractères quelconques. Par exemple, si je fais:
rm allo*.txt
j'efface d'un seul coup les fichiers allo1.txt, allo2.txt, alloa.txt, allo.txt, allo10.txt et allotoi.txt. J'efface également les fichiers allo.important.txt et allo.txt.txt.txt.
Il ne faut pas oublier que pour Linux, le point est un caractère comme un autre et que le concept d'extension n'existe pas pour lui... Même si dans notre exemple, les fichiers finissaient par ".txt" pour qu'un utilisateur se rappelle qu'il s'agit de fichiers texte (à cause d'une vieille habitude Microsoftienne), pour Linux ça ne veut absolument rien dire. Alors si je fais:
rm allo*
j'efface d'un seul coup allo.txt, alloToiLeJeune, allo.doc, allo et allophones.tar.gz. L'astérisque peut donc remplacer un nombre indéfini de caractères, incluant un nombre indéfini de points. C'est pourquoi, si je veux effacer le contenu complet d'un répertoire, je ferai:
rm *
et non pas:
rm *.*
comme je suis habitué de faire en DOS. Comme le point ne représente rien de spécial pour Linux, rm * efface tous les fichiers peu importe leur nom alors que rm *.* efface tous les fichiers qui ont un point quelque part dans leur nom (sur certaines distributions et avec certaines commandes ça inclut "." et ".." qui sont présents dans tous les répertoires alors soyez vigilants!).
rm * efface donc d'un coup tous les fichiers, à une exception près: les fichiers cachés ne sont pas pris en compte par *. Même si logiquement et sémantiquement ils devraient l'être, c'est une exception qui a été ajoutée au système justement pour donner une raison de cacher des fichiers... Si on veut effacer les fichiers cachés, on devra être explicites et faire:
rm .*
Ainsi on demande d'effacer tout ce qui commence par un point, suivi de n'importe quoi d'autre. Ceci inclut les répertoires "." et ".." alors soyez vigilants! (Dans ce cas-ci, rm n'affecte pas les répertoires donc tout ce que arrivera sera deux messages d'erreurs - pas trop grave comme conséquence. Toutefois certaines autres commandes peuvent les affecter et causer certains problèmes).
Le dernier joker est la paire de crochets. Même si ce sont en fait deux caractères, on les considérera comme un seul joker puisque l'un ne va pas sans l'autre.
La paire de crochets remplace un et un seul caractère, pas plus pas moins, un peu comme le point d'interrogation. Toutefois, plutôt que de remplacer n'importe quel caractère, elle remplace un des caractères entre les crochets. Par exemple, ceci:
rm allo[12345].gz
effacera les fichiers allo1.gz, allo2.gz, allo3.gz, allo4.gz et allo5.gz. Les fichiers allo.gz, allo12.gz et alloToi.gz ne seront pas effacés.
On peut également placer une plage de valeur entre les crochets, comme ceci:
rm allo[0-9]
Ceci efface les fichiers allo0 à allo9 et aucun autre.
Il est possible de placer plusieurs plages de valeurs, mélangées avec des valeurs unitaires, comme ceci:
rm allo[0-9A-Zd]
Ceci effacera les fichiers dont le nom commence par allo et se termine soit par un chiffre, soit par une lettre majuscule ou soit par un d minuscule, avec rien entre les deux. Par exemple allo1, alloR et allod mais pas allo1d ni allodd.
On peut bien entendu mélanger plusieurs jokers dans un même masque pour obtenir quelque chose de complexe comme "tout fichier qui commence par une lettre (majuscule ou minuscule) et qui finit par un chiffre, avec n'importe quoi entre les deux:
[a-zA-Z]*[0-9]
Évidemment ce genre de masque est rarement utilisé puisque rarement approprié, mais il est toujours possible de s'en servir si on a un intérêt!
Retour à la table des matières de la section
1.8 - Les redirections
Il faut savoir qu'en Linux il existe trois "canaux" impliqués dans toute exécution (que ce soit l'exécution d'une commande ou celle d'un programme plus complexe):
- Le canal d'entrée standard (stdin - normalement le clavier, qui fournit des données au programme)
- Le canal de sortie standard (stdout - normalement l'écran, qui affiche ce qui sort du programme)
- Le canal d'erreur standard (stderr - normalement l'écran aussi, qui affiche des messages d'erreurs sortant du programme. Linux traite les messages d'erreurs différemment que le reste de la sortie).
On peut si désiré rediriger un de ces canaux vers autre chose que son périphérique standard. L'usage le plus répandu de la redirection est de rediriger la sortie d'une commande ou d'un programme vers un fichier texte pour pouvoir la consulter à loisir plus tard. On fait cela avec l'opérateur ">". Par exemple:
ls -l /etc > ~/fichier
liste le contenu du répertoire /etc, en format long. Plutôt que d'afficher ce contenu à l'écran, Linux va plutôt l'envoyer dans le fichier ~/fichier, c'est à dire fichier dans mon répertoire maison. Si ce fichier existait, il sera écrasé par le nouveau contenu, sinon il sera créé sur-le-champ.
Ceci est une bonne façon de créer rapidement un fichier texte avec du contenu si on en a besoin pour des tests et que le contenu exact n'est pas important.
On peut décider de rediriger la sortie de la même façon mais d'ajouter à la fin du fichier s'il existait déjà (plutôt que de l'écraser). On peut utiliser pour cela l'opérateur ">>". Par exemple:
ls -l /etc >> ~/fichier
Cette façon de faire est idéale pour bâtir un fichier de log qu'on veut consulter plus tard.
Comme les messages d'erreur sont envoyés sur un canal à part, ceux-ci atteindront quand même l'écran et ne seront pas envoyés dans le fichier. Pour rediriger le canal d'erreur, on utilisera l'opérateur "2>" comme ceci:
ls -l /etc 2> ~/fichier
Dans ce cas-ci, seuls les messages d'erreurs seront redirigés vers le fichier, pas la sortie standard. Il est possible de rediriger les deux en faisant ceci:
ls -l /etc > ~/fichier 2> ~/fichier
Notez que dans ce cas, les deux canaux seront redirigés vers le même fichier. Bien qu'il soit possible de les rediriger dans des fichiers différents, c'est rarement ce que nous ferons. Comme le fait de rediriger ces deux canaux vers le même fichier est une opération fort courante, on peut utiliser "2>&1" qui redirge le deuxième canal (l'erreur) vers le premier (la sortie standard), comme ceci:
ls -l /etc > ~/fichier 2>&1
Autre opération moins répandue: on peut rediriger un fichier vers l'entrée standard, remplaçant le clavier, avec l'opérateur "<". Lorsque le programme attendra que l'usager tape quelque chose, il ira plutôt lire une ligne dans le fichier. Ceci peut être utilisé lorsque l'on veut automatiser une processus qui demande des actions de l'usager. Par exemple:
program < ~/fichier
Finalement, le dernier type de redirection (qui est très puissant) est le pipe (en anglais, pour tuyau), représenté par le symbole "|". Le pipe redirige la sortie d'un programme vers l'entrée d'une autre commande. Il n'y a aucun fichier d'impliqué dans cette opération.
Ceci nous permet de lier plusieurs commandes entre elles et donc d'utiliser plusieurs petits outils simples pour en créer un complexe. Un des usages les plus courant est le pipe vers less. less affiche son entrée à l'écran mais insère une pause à chaque écran. De plus, il permet la recherche de mot-clés et le retour en arrière.
Si je tape less fichier, le fichier sera affiché à l'écran par less. Mais que faire si ce que je veux afficher un écran à la fois est le résultat d'une commande? Je peux faire ceci:
ls -Rl / | less
J'affiche ici le contenu du répertoire / (la racine), en format long et de façon récursive (donc le contenu de tous les répertoires du système de fichiers!). Le pipe à less redirige la sortie de ls à less au lieu de l'envoyer à l'écran. C'est less qui l'enverra alors à l'écran, en nous permettant de contrôler le débit!
Retour à la table des matières de la section